package com.zhj.interview.dp;

/**
 * 背包问题
 */
public class KnapsackTest {

    /**
     * 背包问题是动态规划算法中最常出现的一类问题
     * 背包问题分为01背包问题，完全背包问题，多重背包问题，混合三种背包问题，二维费用背包问题，分组背包问题，有依赖的背包问题...
     */
    public static void main(String[] args) {

    }

    /**
     * 01背包问题
     *      * 题目：有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci，得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。
     *      * 特点是：每种物品仅有一件，可以选择放或不放。
     *      用子问题定义状态：即F[i, v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是：
     *      F[i, v] = max{F[i − 1, v], F[i − 1, v − Ci] + Wi}
     *      这个方程非常重要，基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下：“将前i件物品放入容量为v的背包中”这个子问题，
     *      若只考虑第i件物品的策略（放或不放），那么就可以转化为一个只和前i − 1件物品相关的问题。如果不放第i件物品，那么问题就转化为“前i − 1件物品放入容量为v的背包中”，价值为F[i − 1, v]；
     *      如果放第i件物品，那么问题就转化为“前i − 1件物品放入剩下的容量为v − Ci的背包中”，此时能获得的最大价值就是F[i − 1, v − Ci]再加上通过放入第i件物品获得的价值Wi
     */
    public static void test01() {

    }
}
